home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-3139 / stadconv / tostad.asm < prev    next >
Assembly Source File  |  1987-04-21  |  16KB  |  292 lines

  1. *****************************************************************************
  2. *                                                                           *
  3. * Ass-Unterroutine zum Konvertieren eines 32k grossen Bildes (Screenformat) *
  4. * in ein gepacktes STAD-Format.                                             *
  5. *                                                                           *
  6. * Aufruf:   (sp) LONG  Rücksprungadresse                                    *
  7. *          4(sp) LONG  Adresse des Originalbildes (32k Buffer)              *
  8. *          8(sp) LONG  Adresse des gepacktes STAD-Bildes (33k Buffer)       *
  9. * Rückgabe:  d0  WORD  Länge des gepackten STAD-Bildes                      *
  10. *                                                                           *
  11. * History:                                                                  *
  12. * Version 1.0   01.06.1991  Wolfgang Ley                                    *
  13. *                           - Urversion                                     *
  14. * Version 1.1   03.06.1991  Wolfgang Ley                                    *
  15. *                           - Rettung der Register eingeführt               *
  16. *                           - Auswertung der Statistik verbessert           *
  17. *                           - kein zusätzlicher Statistik-Buffer mehr       *
  18. * Version 1.2   05.06.1991  Wolfgang Ley                                    *
  19. *                           - Statistikauswertung wieder rueckgaengig gem.  *
  20. *                           - zusätzliche Zaehler aus v_pack eliminiert     *
  21. *                                                                           *
  22. *****************************************************************************
  23.  
  24.                 TEXT
  25.  
  26.                 movem.l D1-A1,-(SP)     ;Registerinhalte retten
  27.  
  28.                 movea.l 40(SP),A0       ;Adresse des 32k-Bildes
  29.                 movea.l 44(SP),A1       ;Adresse des gepackten STAD-Bildes
  30.  
  31. ;----------------------------------------------------------------------------
  32. ; Statistik aufstellen (welches Byte wird am häufgsten/wenigsten/zweitwenigsten
  33. ; benutzt) --> Wahl von PACK-/ID-/SPECIAL-Byte
  34. ;----------------------------------------------------------------------------
  35.  
  36.                 move.w  #511,D0         ;Index-Register
  37. stat_1:         clr.b   0(A1,D0.w)      ;Anzahlen löschen
  38.                 dbra    D0,stat_1
  39.  
  40.                 move.w  #31999,D0       ;Zeiger innerhalb des Bildes
  41. stat_2:         move.b  0(A0,D0.w),D1   ;Byte holen
  42.                 add.w   D1,D1           ;verdoppeln
  43.                 andi.w  #$01FF,D1       ;Rest löschen
  44.                 addq.w  #1,0(A1,D1.w)   ;und Byte zaehlen
  45.                 dbra    D0,stat_2       ;weiter gehts...
  46.  
  47.                 move.w  #510,D0         ;bisher meist benutztes Byte
  48.                 move.w  0(A1,D0.w),D1   ;Anzahl holen
  49.                 move.w  #508,D2         ;Rest-Zaehler
  50. stat_3:         cmp.w   0(A1,D2.w),D1   ;vergleichen
  51.                 bhs.s   stat_4
  52.                 move.w  D2,D0           ;Stelle merken
  53.                 move.w  0(A1,D2.w),D1   ;und Anzahl merken
  54. stat_4:         subq.w  #2,D2           ;naechster Eintrag
  55.                 bpl.s   stat_3          ;und weiter...
  56.                 lsr.w   #1,D0           ;nun haben wir das PACK-Byte
  57.                 move.b  D0,D3           ;PACK-Byte in D3
  58.  
  59.                 move.w  #510,D0         ;bisher wenig-benutztes Byte
  60.                 move.w  0(A1,D0.w),D1   ;Anzahl holen
  61.                 move.w  #508,D2         ;Rest-Zaehler
  62. stat_5:         cmp.w   0(A1,D2.w),D1   ;vergleichen
  63.                 blo.s   stat_6
  64.                 move.w  D2,D0           ;Stelle merken
  65.                 move.w  0(A1,D2.w),D1   ;Anzahl merken
  66. stat_6:         subq.w  #2,D2           ;naechste Anzahl
  67.                 bpl.s   stat_5          ;und weiter...
  68.                 move.w  #32001,0(A1,D0.w) ;Eintrag "löschen"
  69.                 lsr.w   #1,D0           ;nun haben wir das ID-Byte
  70.                 move.b  D0,D4           ;ID-Byte in D4
  71.  
  72.                 move.w  #510,D0         ;bisher 2-wenigst benutztes Byte
  73.                 move.w  0(A1,D0.w),D1
  74.                 move.w  #508,D2         ;s.o.
  75. stat_7:         cmp.w   0(A1,D2.w),D1
  76.                 blo.s   stat_8
  77.                 move.w  D2,D0
  78.                 move.w  0(A1,D2.w),D1
  79. stat_8:         subq.w  #2,D2
  80.                 bpl.s   stat_7
  81.                 lsr.w   #1,D0           ;nun haben wir das SPEC-Byte
  82.                 move.b  D0,D5           ;SPEC-Byte in D5
  83.  
  84. ;----------------------------------------------------------------------------
  85. ; Horizontal+vertikal Packen, kleineres als STAD-Format übernehmen
  86. ; (dabei muss noch gecheckt werden, ob das gepackte Bild nicht länger geworden
  87. ;  ist - in dem Fall als ungepacktes Bild übernehmen)
  88. ;----------------------------------------------------------------------------
  89.  
  90.                 bsr.s   h_pack          ;horizontal packen
  91.                 move.w  D0,D7           ;Länge (horiz.) merken
  92.                 bsr     v_pack          ;vertikal packen
  93.                 cmp.w   D7,D0           ;vertikal kleiner?
  94.                 bls.s   check           ;ja->alles klaro
  95.                 bsr.s   h_pack          ;nein->nochmal horizontal packen
  96. check:          cmpi.w  #32000,D0       ;ist das gepackte Bild wirklich
  97.                 blo.s   exit            ;kleiner?
  98.                 move.w  #31999,D0       ;sonst Original 32k-Bild
  99. copy:           move.b  (A0)+,(A1)+     ;kopieren
  100.                 dbra    D0,copy
  101.                 move.w  #32000,D0       ;als Läange 32000 Bytes angeben
  102. exit:           movem.l (SP)+,D1-A1     ;Register wieder herstellen
  103.                 rts                     ;und das war's
  104.  
  105. ;----------------------------------------------------------------------------
  106. ; horizontales Packen
  107. ;----------------------------------------------------------------------------
  108.  
  109. h_pack:         move.b  #'p',0(A1,D0.w) ;Header schreiben #'pM85'
  110.                 move.b  #'M',1(A1,D0.w) ;(als Bytes, falls Adresse ungerade)
  111.                 move.b  #'8',2(A1,D0.w)
  112.                 move.b  #'5',3(A1,D0.w)
  113.                 move.b  D4,4(A1,D0.w)   ;ID-Byte schreiben
  114.                 move.b  D3,5(A1,D0.w)   ;PACK-Byte schreiben
  115.                 move.b  D5,6(A1,D0.w)   ;SPEC-Byte schreiben
  116.                 moveq   #7,D0           ;Headerlänge
  117.                 clr.w   D1              ;Offset für das Original
  118. h_lese:         move.b  0(A0,D1.w),D2   ;Byte holen
  119.                 cmp.b   D2,D4           ;ID-Byte gelesen?
  120.                 beq.s   h_use_spec
  121.                 cmp.b   D2,D5           ;SPEC-Byte gelesen?
  122.                 beq.s   h_use_spec
  123.                 cmpi.w  #31997,D1       ;kommen noch 2 weitere Bytes?
  124.                 bhi.s   h_as_is         ;nein -> einzelne Bytes "as is"
  125.                 cmp.b   1(A0,D1.w),D2   ;nochmal gleiches Byte?
  126.                 bne.s   h_as_is         ;nein -> einzelnes Byte
  127.                 cmp.b   2(A0,D1.w),D2   ;nochmal gleiches Byte?
  128.                 bne.s   h_as_is         ;nein -> lohnt noch nicht (2 Bytes)
  129.                 cmp.b   D2,D3           ;PACK-Byte mehrmals?
  130.                 beq.s   h_use_pack      ;ja, also ID-Byte nutzen
  131.                 bra.s   h_use_spec      ;nein, also SPEC-Byte nutzen
  132.  
  133. h_as_is:        move.b  D2,0(A1,D0.w)   ;Byte "as is" speichern
  134.                 addq.w  #1,D0           ;Offset weitersetzen
  135.                 addq.w  #1,D1           ;zum naechsten Byte gehen
  136. h_weiter:       cmpi.w  #32000,D1       ;schon alles?
  137.                 blo.s   h_lese          ;weiter packen..
  138.                 rts                     ;sonst fertig
  139.  
  140. ;----------------------------------------------------------------------------
  141. ; PACK-Byte-Kompression benutzen (horizontal)
  142. ;----------------------------------------------------------------------------
  143.  
  144. h_use_pack:     clr.b   D2              ;Anzahl Pack-Byte
  145.                 addq.w  #1,D1           ;Original-Bild weiterzaehlen
  146. h_pack_1:       cmpi.w  #32000,D1       ;schon am Ende?
  147.                 beq.s   h_pack_fini
  148.                 cmp.b   0(A0,D1.w),D3   ;immer noch PACK-Byte?
  149.                 bne.s   h_pack_fini
  150.                 addq.b  #1,D2           ;Anzahl Pack-Byte erhöhen
  151.                 addq.w  #1,D1           ;Original-Bild weiter
  152.                 cmpi.b  #255,D2         ;Anzahl-max erreicht?
  153.                 bne.s   h_pack_1        ;nein, also weiter auswerten
  154. h_pack_fini:    move.b  D4,0(A1,D0.w)   ;ID-Byte schreiben
  155.                 move.b  D2,1(A1,D0.w)   ;und Anzahl Pack-Byte schreiben
  156.                 addq.w  #2,D0           ;zwei Byte geschrieben...
  157.                 bra.s   h_weiter        ;und weiter lesen...
  158.  
  159. ;----------------------------------------------------------------------------
  160. ; SPEC-Byte-Kompression benutzen (horizontal)
  161. ;----------------------------------------------------------------------------
  162.  
  163. h_use_spec:     clr.b   D6              ;Anzahl SPEC-Byte
  164.                 addq.w  #1,D1           ;Original-Bild weiterzählen
  165. h_spec_1:       cmpi.w  #32000,D1       ;Schon fertig?
  166.                 beq.s   h_spec_fini
  167.                 cmp.b   0(A0,D1.w),D2   ;immer noch Byte d?
  168.                 bne.s   h_spec_fini
  169.                 addq.b  #1,D6           ;Anzahl SPEC-Byte erhöhen
  170.                 addq.w  #1,D1           ;Original-Bild weiter
  171.                 cmpi.b  #255,D6         ;max-Anzahl erreicht?
  172.                 bne.s   h_spec_1        ;nein, also weiter...
  173. h_spec_fini:    move.b  D5,0(A1,D0.w)   ;SPEC-Byte schreiben
  174.                 move.b  D2,1(A1,D0.w)   ;Byte d schreiben
  175.                 move.b  D6,2(A1,D0.w)   ;Anzahl schreiben
  176.                 addq.w  #3,D0           ;drei Bytes geschrieben
  177.                 bra.s   h_weiter
  178.  
  179. ;----------------------------------------------------------------------------
  180. ; vertikales Packen
  181. ;----------------------------------------------------------------------------
  182.  
  183. v_pack:         moveq   #0,D0           ;Länge des gepackten Bildes
  184.                 clr.w   D1              ;Original-Offset
  185.                 move.b  #'p',0(A1,D0.w) ;Header = #'pM86'
  186.                 move.b  #'M',1(A1,D0.w)
  187.                 move.b  #'8',2(A1,D0.w)
  188.                 move.b  #'6',3(A1,D0.w)
  189.                 move.b  D4,4(A1,D0.w)   ;(siehe h_pack)
  190.                 move.b  D3,5(A1,D0.w)
  191.                 move.b  D5,6(A1,D0.w)
  192.                 move.w  #7,D0
  193. v_lese:         move.b  0(A0,D1.w),D2   ;Byte lesen
  194.                 cmp.b   D2,D4           ;ID-Byte gelesen?
  195.                 beq     v_use_spec
  196.                 cmp.b   D2,D5           ;SPEC-Byte gelesen?
  197.                 beq     v_use_spec
  198.                 move.w  D1,D6           ;temporären Zeiger basteln
  199.                 addi.w  #80,D6          ;eine Zeile weiter
  200.                 cmpi.w  #32000,D6       ;Zeilenüberlauf?
  201.                 blo.s   v_hilfe_1
  202.                 subi.w  #31999,D6       ;erste Zeile, eine Spalte weiter
  203.                 cmpi.w  #80,D6          ;schon ganz fertig?
  204.                 beq.s   v_as_is         ;ja, also "as is" benutzen
  205. v_hilfe_1:      cmp.b   0(A0,D6.w),D2   ;gleiches Byte?
  206.                 bne.s   v_as_is         ;nein, einzelnes Byte
  207.                 addi.w  #80,D6          ;Zeile weiter
  208.                 cmpi.w  #32000,D6       ;s.o
  209.                 blo.s   v_hilfe_2
  210.                 cmpi.w  #80,D6
  211.                 beq.s   v_as_is
  212.                 subi.w  #31999,D6       ;erste Zeile, eine Spalte weiter
  213. v_hilfe_2:      cmp.b   0(A0,D6.w),D2   ;nochmal gleiches Byte?
  214.                 bne.s   v_as_is         ;2 gleiche Bytes lohnt noch nicht
  215.                 cmp.b   D2,D3           ;PACK-Byte gelesen?
  216.                 beq.s   v_use_pack      ;ja, also ID-Byte-Codierung
  217.                 bra.s   v_use_spec      ;nein, also SPEC-BYte-Codierung
  218.  
  219. v_as_is:        move.b  D2,0(A1,D0.w)   ;Byte "as is" speichern
  220.                 addq.w  #1,D0           ;1 Byte gespeichert
  221.                 addi.w  #80,D1          ;Original-Bild eine Zeile tiefer
  222.                 cmpi.w  #32000,D1       ;Zeilenüberlauf?
  223.                 blo.s   v_lese          ;nein, also weiterlesen
  224.                 subi.w  #31999,D1       ;Original-Bild-Zeiger korrigieren
  225.                 cmpi.w  #80,D1          ;bereits alles gelesen?
  226.                 bne.s   v_lese          ;nein, also weiterlesen
  227.                 rts                     ;sonst fertig...
  228.  
  229. ;----------------------------------------------------------------------------
  230. ; PACK-Byte-Kompression vertikal
  231. ;----------------------------------------------------------------------------
  232.  
  233. v_use_pack:     clr.b   D2              ;Anzahl Pack-Byte
  234.                 addi.w  #80,D1          ;Original-Bild eine Zeile weiter
  235.                 cmpi.w  #32000,D1       ;Zeileüberlauf?
  236.                 blo.s   v_pack_1
  237.                 subi.w  #31999,D1       ;Offset korrigieren
  238. v_pack_1:       cmp.b   0(A0,D1.w),D3   ;immer noch PACK-Byte?
  239.                 bne.s   v_pack_fini
  240.                 addi.b  #1,D2           ;Anzahl erhöhen
  241.                 addi.w  #80,D1          ;Original-Bild weiter
  242.                 cmpi.w  #32000,D1       ;Zeilüberlauf testen...
  243.                 blo.s   v_pack_2        ;alles glatt gegangen
  244.                 subi.w  #31999,D1       ;Offset korrigieren
  245.                 cmpi.w  #80,D1          ;schon alles fertig?
  246.                 bne.s   v_pack_2        ;nein, also weiter
  247.                 move.b  D4,0(A1,D0.w)   ; ID-Byte schreiben
  248.                 move.b  D2,1(A1,D0.w)   ;und die Anzahl speichern
  249.                 addq.w  #2,D0           ;2 Bytes geschrieben
  250.                 rts                     ;und fertig...
  251. v_pack_2:       cmpi.b  #255,D2         ;max-Anzahl erreicht?
  252.                 bne.s   v_pack_1        ;nein, also weiter untersuchen
  253. v_pack_fini:    move.b  D4,0(A1,D0.w)   ;ID-Byte schreiben
  254.                 move.b  D2,1(A1,D0.w)   ;Anzahl schreiben
  255.                 addq.w  #2,D0           ;zwei Bytes geschrieben
  256.                 bra     v_lese          ;und weiter geht's...
  257.  
  258. ;----------------------------------------------------------------------------
  259. ; SPEC-Byte-Kompression vertikal
  260. ;----------------------------------------------------------------------------
  261.  
  262. v_use_spec:     clr.w   D6              ;Anzahl SPEC-Byte
  263.                 addi.w  #80,D1          ;Original-Bild weiter
  264.                 cmpi.w  #32000,D1       ;Zeileüberlauf?
  265.                 blo.s   v_spec_1        ;nein, alles klaro
  266.                 subi.w  #31999,D1       ;Offsetkorrektur
  267.                 cmpi.w  #80,D1          ;schon alles fertig?
  268.                 beq.s   v_spec_fini_1   ;ja, also abbruch
  269. v_spec_1:       cmp.b   0(A0,D1.w),D2   ;immer noch Byte d?
  270.                 bne.s   v_spec_fini_2
  271.                 addq.w  #1,D6           ;Anzahl erhöhen
  272.                 addi.w  #80,D1          ;Original-Bild weiter
  273.                 cmpi.w  #32000,D1       ;Zeilenüberlauf?
  274.                 blo.s   v_spec_2        ;nein ->
  275.                 subi.w  #31999,D1       ;Offsetkorrektur
  276.                 cmpi.w  #80,D1          ;alles fertig?
  277.                 bne.s   v_spec_2        ;nein ->
  278. v_spec_fini_1:  move.b  D5,0(A1,D0.w)   ;SPEC-Byte schreiben
  279.                 move.b  D2,1(A1,D0.w)   ;Byte d schreiben
  280.                 move.b  D6,2(A1,D0.w)   ;Anzahl schreiben
  281.                 addq.w  #3,D0           ;3 Bytes geschrieben
  282.                 rts                     ;und alles fertig
  283. v_spec_2:       cmpi.w  #255,D6         ;max-Anzahl erreicht?
  284.                 bne.s   v_spec_1        ;nein, also weiter
  285. v_spec_fini_2:  move.b  D5,0(A1,D0.w)   ;SPEC-Byte schreiben
  286.                 move.b  D2,1(A1,D0.w)   ;Byte d schreiben
  287.                 move.b  D6,2(A1,D0.w)   ;Anzahl schreiben
  288.                 addq.w  #3,D0           ;drei Bytes geschrieben
  289.                 bra     v_lese          ;und weiter gehts
  290.  
  291.                 END
  292.